
import json
import logging
from django_redis import get_redis_connection

from erp_system.models import PermissionsModel

logger = logging.getLogger('erp')
# cache_permissions: 缓存权限
# storage：存储
def redis_storage_permissions(user):
    """
    把当前用户的权限信息，缓存到Redis数据库中，
    Redis中存放用户权限的结构为：user_用户ID----》字典{key:path, value[列表]}(json字符串)
    """
    permission_ids = user.roles.values_list('permissions', flat=True).distinct()

    # 根据权限id，获取权限的所有值，一级菜单的权限除外
    permissions = PermissionsModel.objects.filter(is_menu=False, id__in=permission_ids).values('id', 'path', 'method', 'name')

    if not permissions.exists():    # 如果获取的权限里面是空的，没有查到权限
        # 不需要任何动作，只是空放一个return即可
        return

    permissions_dict = {}    # 存放当前用户的权限，path为key
    for permission in permissions:
        # 因为数据需要转换成json格式的字符串，所以排除那些特殊符号
        # replace()替换，将不可见字符都替换成空字符
        # \u200b就是说的Unicode中的不可见字符，比如回车\n，制表符
        method = str(permission.get('method')).replace('\u200b', '')
        path = str(permission.get('path')).replace('\u200b', '')
        _name = str(permission.get('name')).replace('\u200b', '')
        _id = permission.get('id')

        if path in permissions_dict:
            permissions_dict[path].append({
                'method': method,
                'sign': _name,
                'id': _id
            })
        else:
            permissions_dict[path] = [{
                'method': method,
                'sign': _name,
                'id': _id
            }]

    for key in permissions_dict:
        # json.dumps()：把一个字典（上文中里面的字典）变成json。
        permissions_dict[key] = json.dumps(permissions_dict[key])

    # 存放到Redis中
    redis_conn = get_redis_connection("default")     # 获得redis数据库的连接
    logger.info(redis_conn)
    print(redis_conn)
    redis_conn.hmset(f'user_{user.id}', permissions_dict)

    pass